import 'dart:io';
import 'package:path/path.dart' as path;

void main() async {
  final root = getPath();
  const dir = 'user';
  final sourceDir = Directory('$root/proto/$dir'); // 源目录
  final targetDir = Directory('$root/lib/proto'); // 移动目标目录
  final deleteExtensions = ['.pbenum.dart', '.pbjson.dart', '.pbserver.dart']; // 要删除的扩展名列表
  final moveExtensions = {
    // '.jpg': Directory(path.join(targetDir.path, 'images')), // 移动 .jpg 到 images 子目录
    '.pb.dart': Directory(path.join(targetDir.path, dir)) // 移动 .pdf 到 documents 子目录
  };

  await processFiles(
    sourceDir: sourceDir,
    deleteExtensions: deleteExtensions,
    moveExtensions: moveExtensions,
  );
}

/// 处理文件的核心函数
Future<void> processFiles({
  required Directory sourceDir,
  required List<String> deleteExtensions,
  required Map<String, Directory> moveExtensions,
}) async {
  try {
    // 遍历源目录（包含子目录）（递归遍历）
    await for (final fileEntity in sourceDir.list(recursive: true)) {
      if (fileEntity is! File) continue;

      final file = fileEntity;
      // 从第二个点号开始算起
      final ext = path.extension(file.path, 2).toLowerCase();

      // 优先处理删除操作
      if (deleteExtensions.contains(ext)) {
        await _deleteFile(file);
        continue;
      }

      // 处理移动操作
      if (moveExtensions.containsKey(ext)) {
        await _moveFile(file, targetDir: moveExtensions[ext]!);
      }
    }
  } catch (e) {
    print('操作失败: $e');
  }
}

// 获取当前项目的目录
String getPath() {
  // 获取当前脚本的 URI（可能是文件 URI 或 package URI）
  final scriptUri = Platform.script;

  // 转换为文件路径（仅处理 file:// 和 package: 的物理路径）
  String scriptPath;
  if (scriptUri.isScheme('file')) {
    scriptPath = scriptUri.toFilePath();
  } else {
    // 如果是 package URI（如通过 `dart run` 运行），尝试解析为物理路径
    // 注意：此方式在部分打包场景可能不准确
    scriptPath = Platform.script.toFilePath();
  }

  // 获取所在目录路径
  final directoryPath = path.dirname(scriptPath);
  return directoryPath;
}

/// 删除文件
Future<void> _deleteFile(File file) async {
  try {
    await file.delete();
    print('✅ 已删除: ${file.path}');
  } catch (e) {
    print('❌ 删除失败 [${file.path}]: $e');
  }
}

/// 移动文件
Future<void> _moveFile(File file, {required Directory targetDir}) async {
  try {
    // 创建目标目录（如果不存在）
    if (!await targetDir.exists()) {
      await targetDir.create(recursive: true);
    }

    // 构造目标路径
    final fileName = path.basename(file.path);
    final newPath = path.join(targetDir.path, fileName);

    // 处理文件名冲突（自动添加序号）
    File newFile = File(newPath);
    int counter = 1;
    while (await newFile.exists()) {
      final newName = '${path.basenameWithoutExtension(fileName)}_$counter${path.extension(fileName)}';
      newFile = File(path.join(targetDir.path, newName));
      counter++;
    }

    // 执行移动操作
    await file.rename(newFile.path);
    print('🚚 已移动: ${file.path} -> $newFile');
  } catch (e) {
    print('❌ 移动失败 [${file.path}]: $e');
  }
}
